package dao

import (
	"crypto/md5"
	"encoding/hex"
	"errors"
	"go-bluebell/model"

	"gorm.io/gorm"
)

func CheckUserExist(username string) (bool, error) {
	var user model.User
	err := model.DB.Where("username=?", username).First(&user).Error

	if err != nil {
		// 如果错误是ErrRecordNotFound，说明没找到记录
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return false, nil
		}
		// 其它查询中的错误
		return false, err
	}

	// 前用户已存在
	return true, nil
}

func Register(user *model.User) error {
	// 先对用户的密码进行加密，然后在将密码保存到数据库中
	user.Password = encryptPassword(user.Password)
	return model.DB.Create(user).Error
}

// encryptPassword 密码加密
func encryptPassword(oPassword string) string {
	h := md5.New()
	h.Write([]byte("panker"))
	return hex.EncodeToString(h.Sum([]byte(oPassword)))
}

// 用户登录：先根据用户名查找用户信息，再对比密码是否正确

func Login(user *model.User) (err error) {
	oPassword := user.Password // 用户登录的密码
	err = model.DB.Where("username=?", user.Username).First(&user).Error

	// 用户查询失败
	if err != nil {
		// 如果错误是ErrRecordNotFound，说明没找到记录
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return model.ErrorUserNotExist
		}
		// 其它查询中的错误
		return err
	}

	// 判断密码是否正确
	password := encryptPassword(oPassword)
	if password != user.Password {
		return model.ErrorInvalidPassword
	}

	return nil
}

func GetAuthorByID(authorID int64) (author *model.User, err error) {
	author = new(model.User)
	err = model.DB.First(&author, authorID).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			err = model.ErrorInvalidID
		}
	}
	return
}

// GetUserById 根据id获取用户信息
func GetUserById(uid int64) (user *model.User, err error) {
	err = model.DB.First(&user, uid).Error
	return
}
